package priv.utrix.micro.handle;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import priv.utrix.micro.json.R;

import java.util.Arrays;
import java.util.Map;

/**
 * 自定义全局Sentinel返回处理类
 *
 *
 * @author utrix
 * @date 2020/11/11
 */
@Slf4j
public class CustomerBlockHandler {

    /**
     * blockHandler： 统一QPS异常处理函数
     * <p>函数访问范围需要是 public，必需为 static 函数，返回类型需要与原方法相匹配，参数类型需要和原方法相匹配并且最后
     * 加一个额外的参数，类型为 BlockException</p>
     *
     * @param exception sentinel返回的异常类
     * @return priv.utrix.micro.json.R<java.lang.String>
     */
    public static R<Map<String,Object>> handleQPSException(String username, BlockException exception) {
        log.info("============== sentinel异常统一处理进来了 ==================");
        return R.failed("Sentinel限流，QPS阈值控制");
    }

    /**
     * defaultFallback： 默认异常处理返回函数
     * <p>
     *     1. 返回值类型必须与原函数返回值类型一致；
     *     2. 方法参数列表需要为空，或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
     *     defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数，则可以指定 fallbackClass 为对应的类的 Class 对象，
     *     3. 注意对应的函数必需为 static 函数，否则无法解析。
     * </p>
     *
     * @param throwable 捕捉抛出的异常
     * @return priv.utrix.micro.json.R<java.util.Map<java.lang.String,java.lang.Object>>
     */
    public static R<Map<String,Object>> handleDefaultQPSException(Throwable throwable) {
        log.error("Sentinel默认QPS异常处理方法：{}", Arrays.toString(throwable.getStackTrace()));
        return R.failed("Sentinel限流，默认QPS阈值控制");
    }

}
